/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarConvalidacionMateria;

import web.util.Constantes;
import entidad.convalidacionMateria.Solicitudconvalidacionmateria;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.ConvalidacionMateria.SolicitarConvalidacion;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;
import com.sun.rave.web.ui.model.Option;
import com.sun.rave.web.ui.model.UploadedFile;
import entidad.Materia;
import entidad.Persona;
import hero.interfaces.BnNodeValue;
import java.io.File;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import web.util.SendMailEspol;

public class CTRL_SolicitarConvalidacion extends CTRL_Base {

    private SolicitarConvalidacion gui;
    private final String nombreProceso = Constantes.Modelo.modelo_SolicitarConvalidacionMateria;
    private final String nombreActividad = Constantes.SolicitarConvalidacion.solicitarConvalidacion;
    private boolean iteracion = false;

    public CTRL_SolicitarConvalidacion(SolicitarConvalidacion gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
    }

    public void inicializar() throws MensajeException {
        gui.getMenu().setTitulo("Formulario " + Constantes.TipoSolicitud.ConvalidacionMateria.toString());
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
        hLisIteracion();
        /************************************************************
         *Verificar si viene de una iteraccion si es asi hay que precargar la informacion
         ***********************************************************/
        if (isIteracion()) {
            precargarDatosSiEsPosible();
        } else {
            leerMaterias();
        }
    }

    private void leerMaterias() {
        Option[] listaOpciones;
        Option tempOption;
        Vector<Materia> listaMaterias;
        Materia elemMateria;
        try {
            listaMaterias = logica.leerTodasLasMaterias();
            listaOpciones = new Option[listaMaterias.size()];
            for (int i = 0; i < listaMaterias.size(); i++) {
                elemMateria = listaMaterias.get(i);
                tempOption = new Option();
                tempOption.setLabel(elemMateria.getNombre());
                tempOption.setValue(elemMateria.getIdMateria());
                listaOpciones[i] = tempOption;
            }
            gui.getDdListMateriaDefaultOptions().setOptions(listaOpciones);
            gui.getDdListMateria().setSelected(listaOpciones[0].getValue());

        } catch (SQLException ex) {
            Logger.getLogger(CTRL_SolicitarConvalidacion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    private void hLisIteracion() {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                setIteracion(false);
                return;
            }
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);

            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            if (actividad.getStartDate() != null) {
                setIteracion(true);
            } else {
                setIteracion(false);
            }
        } catch (Exception ex) {
            setIteracion(false);
        }
    }

    private void precargarDatosSiEsPosible() throws MensajeException {
        BnNodeValue actividad;
        String nombreInstanciaProceso;
        Solicitudconvalidacionmateria solicitud;
        int idSolicitudAyudantia;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso != null) {
                this.inicializarInstancia(nombreInstanciaProceso);
            }
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            if (actividad.getStartDate() != null) {
                idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
                solicitud = logica.getLogConvalidacionMateria().leerSolicitudConvalidacionNivel2(idSolicitudAyudantia);
                gui.getLblAConvalidar().setText(solicitud.getAConvalidar());
                gui.getLblMateria().setText(solicitud.getMateria().getNombre());
                if (solicitud.getObservacionEstudiante() != null) {
                    gui.getTxtaObservacionesEstudiantes().setText(solicitud.getObservacionEstudiante());
                } else {
                    gui.getTxtaObservacionesEstudiantes().setText(Constantes.Mensajes.noComentarios);
                }

                gui.getMenu().setTitulo(nombreProceso + "_" + idSolicitudAyudantia + ": " + nombreActividad);
                if (solicitud.getPathArchivoAdjunto() != null) {

                    gui.getLblArchivoAdjunto().setVisible(true);
                    gui.getLinkArchivoAdjunto().setVisible(true);

                    gui.getLinkArchivoAdjunto().setText(solicitud.getNombreArchivo());
                    gui.getLinkArchivoAdjunto().setUrl(Constantes.Rutas.rutaArchivos + solicitud.getPathArchivoAdjunto().replaceAll(" ", "%20"));
                } else {
                    gui.getLblArchivoAdjunto().setVisible(false);
                    gui.getLinkArchivoAdjunto().setVisible(false);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_SolicitarConvalidacion.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public void guardarActividadSolicitarConvalidacion() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudconvalidacionmateria solicitud = new Solicitudconvalidacionmateria();
        int idSolicitud;
        try {
            if (!gui.getUfArchivo().getValueAsString(facesContext).equals("")) {
                String nombreArchivo = (String) gui.getUfArchivo().getValueAsString(facesContext);
                if (nombreArchivo.indexOf(nombreProceso) >= 0) {
                    throw new MensajeException("El nombre del archivo no es válido.");
                }
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (isIteracion() && (nombreInstanciaProceso != null)) {
                this.inicializarInstancia(nombreInstanciaProceso);
                idSolicitud = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
                solicitud = logica.getLogConvalidacionMateria().leerSolicitudConvalidacionNivel2(idSolicitud);
                solicitud = llenarDatosActividad(solicitud, nombreInstanciaProceso);
                solicitud = logica.getLogConvalidacionMateria().guardarYClonarSolicitudConvalidacion(solicitud);
            }

            if ((nombreInstanciaProceso == null) && (!isIteracion())) {
                int idMateria = (Integer) gui.getDdListMateria().getSelected();
                int idPersona = logica.leerPersonaPorUsuario(usuario.getUsuario()).getIdPersona();
                Solicitudconvalidacionmateria solicitudexistente = logica.getLogConvalidacionMateria().leerSolicitudConvalidacion(idPersona, Constantes.EstadoSolicitud.Activa.toString(), idMateria);
                if (solicitudexistente != null) {
                    throw new MensajeException("No es posible iniciar la solicitud. Actualmente posee una solicitud de convalidación activa para la materia seleccionada. " +
                            "'" + this.nombreProceso + "_" + solicitudexistente.getIdSolicitudConvalidacion() + "'");
                }
                prjSession.instantiateProject(nombreProceso);
                nombreInstanciaProceso = prjSession.getName();
                solicitud = llenarDatosActividad(null, nombreInstanciaProceso);
                solicitud = logica.getLogConvalidacionMateria().nuevoSolicitudConvalidacion(solicitud);
                prjSession.setProperty(Constantes.Atributo.idSolicitudProceso, solicitud.getIdSolicitudConvalidacion() + "");
                solicitud = logica.getLogConvalidacionMateria().clonarSolicitudConvalidacion(solicitud);
            }
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitud.getIdSolicitudConvalidacion() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);

            //enviar mail de notificacion
            int idSubdecano = new Integer(logica.leerConfiguracionPorNombre(Constantes.Configuracion.Subdecano.getNombreEnBD()).getValor());
            String to = logica.leerPersona(idSubdecano).getCorreo();
            int idSolicitudCompleta = solicitud.getFkParent();
            solicitud = logica.getLogConvalidacionMateria().leerSolicitudConvalidacionNivel2(idSolicitudCompleta);
            String subject = Constantes.MensajesCorreo.tituloCorreo + "Revisión de Solicitud de Convalidación de Materia pendiente";
            String message = Constantes.TipoSolicitud.ConvalidacionMateria + "_" + solicitud.getIdSolicitudConvalidacion() + ": " +
                    Constantes.SolicitarCambio.revisarSolicitud + "\n\n" + "Título: " + solicitud.toString() + "\n" +
                    "Solicitante: " + logica.leerPersona(solicitud.getFkIdEstudiante()).toString() + "\n\n" +
                    "La solicitud está en espera de su evaluación." +
                    "\n\n" + "Puede realizar la actividad dirigiéndose a la sección actividades pendientes del sistema." + Constantes.MensajesCorreo.referenciaSistema;
            SendMailEspol sendMail = new SendMailEspol(to, subject, message);
            sendMail.send();
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_SolicitarConvalidacion.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    private Solicitudconvalidacionmateria llenarDatosActividad(
            Solicitudconvalidacionmateria solicitudtmp, String nombreInstanciaProceso) throws Exception {
        Solicitudconvalidacionmateria solicitud;
        try {
            if (solicitudtmp == null) {
                solicitud = new Solicitudconvalidacionmateria();
            } else {
                solicitud = solicitudtmp;
            }

            if (!isIteracion()) {
                int idMateria = (Integer) gui.getDdListMateria().getSelected();
                int idPersona = logica.leerPersonaPorUsuario(usuario.getUsuario()).getIdPersona();
                solicitud.setAConvalidar((String) gui.getTxtMateriaAConvalidar().getText());
                solicitud.setFkIdMateria(idMateria);
                solicitud.setFkIdEstudiante(idPersona);
                solicitud.setEstado(Constantes.EstadoSolicitud.Activa.toString());
                solicitud.setNombreinstanciaproceso(nombreInstanciaProceso);
            }
            solicitud.setObservacionEstudiante((String) gui.getTxtaObservacionesEstudiantes().getText());
            if (!gui.getUfArchivo().getValueAsString(facesContext).equals("")) {
                String nombreArchivo = (String) gui.getUfArchivo().getValueAsString(facesContext);
                solicitud.setNombreArchivo(nombreArchivo);
                UploadedFile uploadedFile = gui.getUfArchivo().getUploadedFile();

                HttpServletRequest servletRequest = (HttpServletRequest) externalContext.getRequest();
                String pathRaiz = (String) servletRequest.getAttribute("path");
                String pathCarpetas = "/" + "Archivos" + "/" + "Solicitar Convalidacion";
                File carpeta = new File(pathRaiz + pathCarpetas + "/" + nombreInstanciaProceso);
                carpeta.mkdirs();
                File file = new File(pathRaiz + pathCarpetas + "/" + nombreInstanciaProceso + "/" + nombreArchivo);
                uploadedFile.write(file);
                String relativePath = pathCarpetas + "/" + nombreInstanciaProceso + "/" + nombreArchivo;
                solicitud.setPathArchivoAdjunto(relativePath);
            }
        } catch (Exception ex) {
            Logger.getLogger(CTRL_SolicitarConvalidacion.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }
        return solicitud;
    }

    public boolean isIteracion() {
        return iteracion;
    }

    public void setIteracion(boolean iteracion) {
        this.iteracion = iteracion;
        if (iteracion) {
            gui.getLblAConvalidar().setVisible(true);
            gui.getLblMateria().setVisible(true);
            gui.getTxtMateriaAConvalidar().setRendered(false);
            gui.getDdListMateria().setVisible(false);
            gui.getLblArchivoAdjunto().setVisible(true);
            gui.getLinkArchivoAdjunto().setVisible(true);

        } else {
            gui.getLblArchivoAdjunto().setVisible(false);
            gui.getLinkArchivoAdjunto().setVisible(false);

            gui.getLblAConvalidar().setVisible(false);
            gui.getLblMateria().setVisible(false);
            gui.getTxtMateriaAConvalidar().setRendered(true);
            gui.getDdListMateria().setVisible(true);
        }
    }
}
